package com.javacoo.limit.client.config;

import com.javacoo.limit.client.enums.FallbackStrategy;
import com.javacoo.limit.client.enums.LimitType;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 限流规则配置
 * <li>单个接口方法限流规则配置</li>
 *
 * @author: duanyong@jccfc.com
 * @since: 2021/5/23 15:31
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class LimitRule {
    /** 给定的时间范围 单位(秒),默认值*/
    public static final int DEFAULT_PERIOD = 1;
    /** 一定时间内最多访问次数,默认值*/
    public static final int DEFAULT_COUNT = 50;
    /**
     * defaultKey
     */
    private String defaultKey = "";
    /**
     * key
     */
    private String key;

    /**
     * Key的前缀
     */
    private String prefix;
    /**
     * 给定的时间范围 单位(秒)
     */
    private int period;

    /**
     * 一定时间内最多访问次数
     */
    private int count;
    /**
     * 限流类型
     */
    private LimitType limitType;
    /**
     * 降级策略:默认快速失败
     */
    private FallbackStrategy fallbackStrategy;
    /**
     * 当降级策略为:回退 时回退处理接口实现名称
     */
    private String fallbackImpl;
    /**
     * 初始化
     * <li></li>
     * @author duanyong@jccfc.com
     * @date 2021/5/22 14:06
     * @return: void
     */
    public LimitRule init(){
        this.setPeriod(DEFAULT_PERIOD);
        this.setCount(DEFAULT_COUNT);
        this.setLimitType(LimitType.CUSTOMER);
        this.setFallbackStrategy(FallbackStrategy.FAIL_FAST);
        this.setFallbackImpl(LimitConfig.DEFAULT_IMPL);
        return this;
    }
}
